package co.edu.usbcali.csru.presentation.backingBeans;

import co.edu.usbcali.csru.dataaccess.dao.ReservaDAO;
import co.edu.usbcali.csru.exceptions.*;
import co.edu.usbcali.csru.modelo.*;
import co.edu.usbcali.csru.modelo.dto.ReservaDTO;
import co.edu.usbcali.csru.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.csru.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlOutputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.ext.HtmlSelectOneRadio;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import java.math.BigDecimal;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


/**
*
*
* @author Zathura Code Generator http://code.google.com/p/zathura
*
*/
public class ReservaView extends DataSource implements Renderable,
    DisposableBean {
    private HtmlInputText txtEstCodigo_Estado;
    private HtmlInputText txtPriCodigo_PropietarioInmueble;
    private HtmlInputText txtZocCodigo_ZonaComun;
    private HtmlInputText txtResCodigo;
    private SelectInputDate txtResFecha;
    private SelectInputDate txtResHoraFin;
    private SelectInputDate txtResHoraInicio;
    private HtmlCommandButton btnSave;
    private HtmlCommandButton btnModify;
    private HtmlCommandButton btnDelete;
    private HtmlCommandButton btnClear;
    private boolean renderDataTable;
    private boolean flag = true;
    private RenderManager renderManager;
    private PersistentFacesState state = PersistentFacesState.getInstance();
    private List<Reserva> reserva;
    private List<ReservaDTO> reservaDTO;
    private HtmlSelectOneMenu cmbTipoZonasComunes;
	private List<ZonaComun> listaZonasComunes;
    private Date fechaActual = new Date();
	private List<SelectItem> tipos;
	private HtmlInputText txtNombreConsulta;
	private List<Reserva> reservasEncontradas;
	private HtmlOutputText cmlReserva;

    public ReservaView() {
        super("");
    }
    
	public boolean revisarCampos() {

		if (!Utilities.isNumeric(txtResCodigo.getValue().toString())) {
			FacesUtils.addErrorMessage("El codigo debe ser numerico.");
			return false;
		}
		
		String valor = cmbTipoZonasComunes.getValue().toString();
		if (valor.equals("-1")) {
			FacesUtils
					.addErrorMessage("Seleccione la zona comun que desea reservar");
		}

		if (txtResHoraFin.getValue() == null
				|| txtResHoraInicio.getValue() == null) {
			FacesUtils.addErrorMessage("Se deben llenar todos los campos.");
			return false;
		}
		

		if (fechaActual.after((Date) txtResHoraInicio.getValue())
				|| fechaActual.after((Date) txtResHoraFin.getValue())) {
			FacesUtils
					.addErrorMessage("No puede seleccionar una fecha anterior a la actual");
		}

		if (((Date) txtResHoraFin.getValue())
				.before((Date) txtResHoraInicio.getValue())) {
			FacesUtils
					.addErrorMessage("La fecha-hora final no puede ser anterior a la fecha-hora inicial");
		}

		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		String fechaIni = formato.format(txtResHoraInicio.getValue());

		System.out.println("FECHAAAA:" + fechaIni);

		if (Utilities.strToDate(fechaIni, "dd/MM/yyyy") == null) {
			FacesUtils.addErrorMessage("La fecha no es correcta.");
		}
		
		return true;
	}


    public String action_clear() {
        txtEstCodigo_Estado.setValue(null);
        txtEstCodigo_Estado.setDisabled(true);
        txtPriCodigo_PropietarioInmueble.setValue(null);
        txtPriCodigo_PropietarioInmueble.setDisabled(true);
		cmbTipoZonasComunes.setValue("-1");
		cmbTipoZonasComunes.setDisabled(false);
        //txtZocCodigo_ZonaComun.setValue(null);
        //txtZocCodigo_ZonaComun.setDisabled(true);
        //txtResFecha.setValue(null);
        //txtResFecha.setDisabled(true);
        txtResHoraFin.setValue(null);
        txtResHoraFin.setDisabled(true);
        txtResHoraInicio.setValue(null);
        txtResHoraInicio.setDisabled(true);
        txtResCodigo.setValue(null);
        txtResCodigo.setDisabled(false);
        btnSave.setDisabled(true);
        btnDelete.setDisabled(true);
        btnModify.setDisabled(true);
        btnClear.setDisabled(false);

        return "";
    }
    
    
    

    public void listener_txtId(ValueChangeEvent event) {
        if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
            Reserva entity = null;
            String codInmueble="";
            
            String login = (String) FacesUtils.getSession().getAttribute("Login");
			String password = (String) FacesUtils.getSession().getAttribute("Password");
			

            try {
                String resCodigo = new String(txtResCodigo.getValue().toString());
				entity = BusinessDelegatorView.getReserva(resCodigo);
				Usuario u = BusinessDelegatorView.getUsuarioParametro(login,
						password).get(0);
				codInmueble = action_darCodigo(u.getPersona().getPerCedula());
			} catch (Exception e) {
				e.printStackTrace();
			}

			FacesUtils.getSession().setAttribute("codInmu", codInmueble);

			System.out.println("CODIGO INMUEBLE" + codInmueble);

			if (entity == null) {
				txtEstCodigo_Estado.setDisabled(true);
				txtEstCodigo_Estado.setValue("ACTIVA");
				txtPriCodigo_PropietarioInmueble.setDisabled(true);
				txtPriCodigo_PropietarioInmueble.setValue(FacesUtils
						.getSession().getAttribute("codInmu"));
				//txtZocCodigo_ZonaComun.setDisabled(false);
				// txtResFecha.setDisabled(false);
				txtResHoraFin.setDisabled(false);
				txtResHoraInicio.setDisabled(false);
				txtResCodigo.setDisabled(true);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				//txtResFecha.setValue(entity.getResFecha());
				//txtResFecha.setDisabled(false);
				txtResHoraFin.setValue(entity.getResHoraFin());
                txtResHoraFin.setDisabled(false);
                txtResHoraInicio.setValue(entity.getResHoraInicio());
                txtResHoraInicio.setDisabled(false);
                txtEstCodigo_Estado.setValue(entity.getEstado().getEstCodigo());
                txtEstCodigo_Estado.setDisabled(true);
                txtPriCodigo_PropietarioInmueble.setValue(entity.getPropietarioInmueble()
                                                                .getPriCodigo());
                txtPriCodigo_PropietarioInmueble.setDisabled(true);
                //txtZocCodigo_ZonaComun.setValue(entity.getZonaComun().getZocCodigo());
                //txtZocCodigo_ZonaComun.setDisabled(false);
                System.out.println(entity.getZonaComun().getZocCodigo());
                cmbTipoZonasComunes.setValue(entity.getZonaComun().getZocCodigo());
                cmbTipoZonasComunes.setDisabled(false);
                txtResCodigo.setValue(entity.getResCodigo());
                txtResCodigo.setDisabled(true);
                btnSave.setDisabled(true);
                btnDelete.setDisabled(false);
                btnModify.setDisabled(false);
                btnClear.setDisabled(false);
            }
        }
    }
    
    public String action_darCodigo(String usuCedula) throws Exception {
		String codigo="";
		try {						
			codigo = BusinessDelegatorView.obtenerCodigoPropietarioInmueble(usuCedula);			
		} catch (Exception e) {
			throw e;
		}
		return codigo;
	}

	public String action_save() {

		if (!revisarCampos()) {
			return "";
		}

		try {

			Date horaInicio = (Date) txtResHoraInicio.getValue();
			Date horaFinal = (Date) txtResHoraFin.getValue();
				/*            
	            //Convertir fecha a String con un formato
	            SimpleDateFormat sdf = new SimpleDateFormat("MMMM/dd/yyyy HH24:mm");
	            String horaInicioConFormato = sdf.format(horaInicio);
	            String horaFinConFormato = sdf.format(horaFinal);
	            //System.out.println("Fecha en formato dd/MM/yyyy : " + fechaConFormato);
	            */
			//System.out.println("BDD"+BusinessDelegatorView.disponibilidadFecha(horaInicioConFormato));
			
			if (fechaActual.before((Date) txtResHoraInicio.getValue())
					&& fechaActual.before((Date) txtResHoraInicio.getValue())) {
				if (((Date) txtResHoraFin.getValue())
						.after((Date) txtResHoraInicio.getValue())) {

					BusinessDelegatorView
							.saveReserva(
									FacesUtils.checkString(txtResCodigo),
									horaInicio,	horaFinal, horaInicio, "1",
									FacesUtils
											.checkString(txtPriCodigo_PropietarioInmueble),
									FacesUtils.checkString(cmbTipoZonasComunes));
					FacesUtils
							.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
					action_clear();
				}
			}


		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteReserva(FacesUtils.checkString(
                    txtResCodigo));
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
            action_clear();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

	public String action_modify() {
		if (!revisarCampos()) {
			return "";
		}

		try {
			Date horaInicio = (Date) txtResHoraInicio.getValue();
			Date horaFinal = (Date) txtResHoraFin.getValue();

			if (fechaActual.before((Date) txtResHoraInicio.getValue())
					&& fechaActual.before((Date) txtResHoraInicio.getValue())) {
				if (((Date) txtResHoraFin.getValue())
						.after((Date) txtResHoraInicio.getValue())) {

					BusinessDelegatorView
							.updateReserva(
									FacesUtils.checkString(txtResCodigo),
									horaInicio,
									horaFinal,
									horaInicio,
									"1",
									FacesUtils
											.checkString(txtPriCodigo_PropietarioInmueble),
									FacesUtils.checkString(cmbTipoZonasComunes));
					FacesUtils
							.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
					action_clear();
				}
			}
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	
	
	public String action_cambiarEstado() {

		if (!revisarCampos()) {
			return "";
		}

		try {

			String codigoEstado = "";
			String resCodigo = txtResCodigo.getValue().toString();
			Reserva r = BusinessDelegatorView.getReserva(resCodigo);

			if (r.getEstado().getEstCodigo().equals("1")) {
				codigoEstado = "2";
			}
			if (r.getEstado().getEstCodigo().equals("2")) {
				codigoEstado = "1";
			}

			BusinessDelegatorView.updateReserva(
					FacesUtils.checkString(txtResCodigo), r.getResHoraInicio(),
					r.getResHoraFin(), r.getResHoraInicio(), codigoEstado,
					FacesUtils.checkString(txtPriCodigo_PropietarioInmueble),
					FacesUtils.checkString(cmbTipoZonasComunes));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("ReservaView").requestRender();
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

    public String action_modifyWitDTO(String resCodigo, Date resFecha,
        Date resHoraFin, Date resHoraInicio, String estCodigo_Estado,
        String priCodigo_PropietarioInmueble, String zocCodigo_ZonaComun)
        throws Exception {
        try {
            BusinessDelegatorView.updateReserva(resCodigo, resFecha,
                resHoraFin, resHoraInicio, estCodigo_Estado,
                priCodigo_PropietarioInmueble, zocCodigo_ZonaComun);
            renderManager.getOnDemandRenderer("ReservaView").requestRender();
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
        } catch (Exception e) {
            //renderManager.getOnDemandRenderer("ReservaView").requestRender();
            FacesUtils.addErrorMessage(e.getMessage());
            throw e;
        }

        return "";
    }

    public List<Reserva> getReserva() {
        if (flag) {
            try {
                reserva = BusinessDelegatorView.getReserva();
                flag = false;
            } catch (Exception e) {
                flag = true;
                FacesUtils.addErrorMessage(e.getMessage());
            }
        }

        return reserva;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setReserva(List<Reserva> reserva) {
        this.reserva = reserva;
    }

    public boolean isRenderDataTable() {
        try {
            if (flag) {
                if (BusinessDelegatorView.findTotalNumberReserva() > 0) {
                    renderDataTable = true;
                } else {
                    renderDataTable = false;
                }
            }

            flag = false;
        } catch (Exception e) {
            renderDataTable = false;
            e.printStackTrace();
        }

        return renderDataTable;
    }

    public DataModel getData() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModel(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<Reserva> getDataPage(int startRow, int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberReserva = 0;

        try {
            totalNumberReserva = BusinessDelegatorView.findTotalNumberReserva()
                                                      .intValue();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberReserva) {
            endIndex = totalNumberReserva;
        }

        try {
            reserva = BusinessDelegatorView.findPageReserva(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            // Remove this Renderable from the existing render groups.
            //leaveRenderGroups();        			
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Add this Renderable to the new render groups.
        //joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate.  If the SessionManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with Hibernate, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        flag = true;

        return new DataPage<Reserva>(totalNumberReserva, startRow, reserva);
    }

    public DataModel getDataDTO() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModelDTO(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<ReservaDTO> getDataPageDTO(int startRow, int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberReserva = 0;

        try {
            totalNumberReserva = BusinessDelegatorView.findTotalNumberReserva()
                                                      .intValue();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberReserva) {
            endIndex = totalNumberReserva;
        }

        try {
            reserva = BusinessDelegatorView.findPageReserva(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            if (Utilities.validationsList(reserva)) {
                reservaDTO = new ArrayList<ReservaDTO>();

                for (Reserva reservaTmp : reserva) {
                    ReservaDTO reservaDTO2 = new ReservaDTO();
                    reservaDTO2.setResCodigo(reservaTmp.getResCodigo().toString());
                    reservaDTO2.setResFecha(reservaTmp.getResFecha());
                    reservaDTO2.setResHoraFin(reservaTmp.getResHoraFin());
                    reservaDTO2.setResHoraInicio(reservaTmp.getResHoraInicio());
                    reservaDTO2.setEstCodigo_Estado((reservaTmp.getEstado()
                                                               .getEstCodigo() != null)
                        ? reservaTmp.getEstado().getEstCodigo().toString() : null);
                    reservaDTO2.setPriCodigo_PropietarioInmueble((reservaTmp.getPropietarioInmueble()
                                                                            .getPriCodigo() != null)
                        ? reservaTmp.getPropietarioInmueble().getPriCodigo()
                                    .toString() : null);
                    reservaDTO2.setZocCodigo_ZonaComun((reservaTmp.getZonaComun()
                                                                  .getZocCodigo() != null)
                        ? reservaTmp.getZonaComun().getZocCodigo().toString()
                        : null);
                    reservaDTO2.setReserva(reservaTmp);
                    reservaDTO2.setReservaView(this);
                    reservaDTO.add(reservaDTO2);
                }
            }

            // Remove this Renderable from the existing render groups.
            leaveRenderGroups();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Add this Renderable to the new render groups.
        joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate.  If the SessionManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with Hibernate, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        flag = true;

        return new DataPage<ReservaDTO>(totalNumberReserva, startRow, reservaDTO);
    }

    protected boolean isDefaultAscending(String sortColumn) {
        return true;
    }

    /**
    * This method is called when a render call is made from the server. Render
    * calls are only made to views containing an updated record. The data is
    * marked as dirty to trigger a fetch of the updated record from the
    * database before rendering takes place.
    */
    public PersistentFacesState getState() {
        onePageDataModel.setDirtyData();

        return state;
    }

    /**
    * This method is called from faces-config.xml with each new session.
    */
    public void setRenderManager(RenderManager renderManager) {
        this.renderManager = renderManager;
    }

    public void renderingException(RenderingException arg0) {
        if (arg0 instanceof TransientRenderingException) {
        } else if (arg0 instanceof FatalRenderingException) {
            // Remove from existing Customer render groups.
            leaveRenderGroups();
        }
    }

    /**
    * Remove this Renderable from existing uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void leaveRenderGroups() {
        if (Utilities.validationsList(reservaDTO)) {
            for (ReservaDTO reservaTmp : reservaDTO) {
                renderManager.getOnDemandRenderer("ReservaView").remove(this);
            }
        }
    }

    /**
    * Add this Renderable to the new uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void joinRenderGroups() {
        if (Utilities.validationsList(reservaDTO)) {
            for (ReservaDTO reservaTmp : reservaDTO) {
                renderManager.getOnDemandRenderer("ReservaView").add(this);
            }
        }
    }

    public void dispose() throws Exception {
    }

    public RenderManager getRenderManager() {
        return renderManager;
    }

    public void setState(PersistentFacesState state) {
        this.state = state;
    }

    public HtmlInputText getTxtEstCodigo_Estado() {
        return txtEstCodigo_Estado;
    }

    public void setTxtEstCodigo_Estado(HtmlInputText txtEstCodigo_Estado) {
        this.txtEstCodigo_Estado = txtEstCodigo_Estado;
    }

    public HtmlInputText getTxtPriCodigo_PropietarioInmueble() {
        return txtPriCodigo_PropietarioInmueble;
    }

    public void setTxtPriCodigo_PropietarioInmueble(
        HtmlInputText txtPriCodigo_PropietarioInmueble) {
        this.txtPriCodigo_PropietarioInmueble = txtPriCodigo_PropietarioInmueble;
    }

    public HtmlInputText getTxtZocCodigo_ZonaComun() {
        return txtZocCodigo_ZonaComun;
    }

    public void setTxtZocCodigo_ZonaComun(HtmlInputText txtZocCodigo_ZonaComun) {
        this.txtZocCodigo_ZonaComun = txtZocCodigo_ZonaComun;
    }

    public SelectInputDate getTxtResFecha() {
        return txtResFecha;
    }

    public void setTxtResFecha(SelectInputDate txtResFecha) {
        this.txtResFecha = txtResFecha;
    }

    public SelectInputDate getTxtResHoraFin() {
        return txtResHoraFin;
    }

    public void setTxtResHoraFin(SelectInputDate txtResHoraFin) {
        this.txtResHoraFin = txtResHoraFin;
    }

    public SelectInputDate getTxtResHoraInicio() {
        return txtResHoraInicio;
    }

    public void setTxtResHoraInicio(SelectInputDate txtResHoraInicio) {
        this.txtResHoraInicio = txtResHoraInicio;
    }

    public HtmlInputText getTxtResCodigo() {
        return txtResCodigo;
    }

    public void setTxtResCodigo(HtmlInputText txtResCodigo) {
        this.txtResCodigo = txtResCodigo;
    }

    public HtmlCommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(HtmlCommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public HtmlCommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(HtmlCommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public HtmlCommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(HtmlCommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public HtmlCommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(HtmlCommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public void setRenderDataTable(boolean renderDataTable) {
        this.renderDataTable = renderDataTable;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public List<ReservaDTO> getReservaDTO() {
        return reservaDTO;
    }

    public void setReservaDTO(List<ReservaDTO> reservaDTO) {
        this.reservaDTO = reservaDTO;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }
    
    

    public List<ZonaComun> getListaZonasComunes() {
		return listaZonasComunes;
	}

	public void setListaZonasComunes(List<ZonaComun> listaZonasComunes) {
		this.listaZonasComunes = listaZonasComunes;
	}

	public Date getFechaActual() {
		return fechaActual;
	}

	public void setFechaActual(Date fechaActual) {
		this.fechaActual = fechaActual;
	}

	public List<SelectItem> getTipos() {
		return tipos;
	}

	public void setTipos(List<SelectItem> tipos) {
		this.tipos = tipos;
	}

	public void setCmbTipoZonasComunes(HtmlSelectOneMenu cmbTipoZonasComunes) {
		this.cmbTipoZonasComunes = cmbTipoZonasComunes;
	}



	/**
    * A special type of JSF DataModel to allow a datatable and datapaginator
    * to page through a large set of data without having to hold the entire
    * set of data in memory at once.
    * Any time a managed bean wants to avoid holding an entire dataset,
    * the managed bean declares this inner class which extends PagedListDataModel
    * and implements the fetchData method. fetchData is called
    * as needed when the table requires data that isn't available in the
    * current data page held by this object.
    * This requires the managed bean (and in general the business
    * method that the managed bean uses) to provide the data wrapped in
    * a DataPage object that provides info on the full size of the dataset.
    */
    private class LocalDataModel extends PagedListDataModel {
        public LocalDataModel(int pageSize) {
            super(pageSize);
        }

        public DataPage<Reserva> fetchPage(int startRow, int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPage(startRow, pageSize);
        }
    }

    private class LocalDataModelDTO extends PagedListDataModel {
        public LocalDataModelDTO(int pageSize) {
            super(pageSize);
        }

        public DataPage<ReservaDTO> fetchPage(int startRow, int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPageDTO(startRow, pageSize);
        }
    }
    
	public HtmlSelectOneMenu getCmbTipoZonasComunes() {
		listaZonasComunes = new ArrayList<ZonaComun>();
		tipos = new ArrayList<SelectItem>();
		try {

			listaZonasComunes = BusinessDelegatorView.getZonaComun();
			SelectItem itm = new SelectItem("-1", "Seleccione Una Zona Comun");
			tipos.add(itm);
			for (int i = 0; i < listaZonasComunes.size(); i++) {
				SelectItem itm2 = new SelectItem(listaZonasComunes.get(i)
						.getZocCodigo(), listaZonasComunes.get(i)
						.getZocNombre());
				tipos.add(itm2);
			}
		} catch (Exception e) {
			//
		}
		return cmbTipoZonasComunes;
	}

	public HtmlInputText getTxtNombreConsulta() {
		return txtNombreConsulta;
	}

	public void setTxtNombreConsulta(HtmlInputText txtNombreConsulta) {
		this.txtNombreConsulta = txtNombreConsulta;
	}
	
	public List<Reserva> getReservasEncontradas() {
		return reservasEncontradas;
	}

	public void setReservasEncontradas(List<Reserva> reservasEncontradas) {
		this.reservasEncontradas = reservasEncontradas;
	}
	
	public HtmlOutputText getCmlReserva() {
		return cmlReserva;
	}

	public void setCmlReserva(HtmlOutputText cmlReserva) {
		this.cmlReserva = cmlReserva;
	}

	public void action_buscarPorCodigo(ActionEvent e) {
		
		  String codInmueble="";
		  String txtNombCon = txtNombreConsulta.getValue().toString();
		  String login = (String) FacesUtils.getSession().getAttribute("Login");
		  String password = (String) FacesUtils.getSession().getAttribute("Password");

		try {
			Usuario u = BusinessDelegatorView.getUsuarioParametro(login, password).get(0);
			codInmueble= action_darCodigo(u.getPersona().getPerCedula());
			System.out.println("xxxxxx"+codInmueble);

			List<Reserva> reseEncontradas = BusinessDelegatorView.buscarPorCodigoReserva(codInmueble, txtNombCon);

			reservasEncontradas = new ArrayList<Reserva>();
			for (int i = 0; i < reseEncontradas.size(); i++) {
				Reserva re = new Reserva();
				re.setResCodigo(reseEncontradas.get(i)
						.getResCodigo());
				re.setZonaComun(reseEncontradas.get(i).getZonaComun());
				re.setResHoraInicio(reseEncontradas.get(i)
						.getResHoraInicio());
				re.setResHoraFin(reseEncontradas.get(i)
						.getResHoraFin());
				re.setEstado(reseEncontradas.get(i).getEstado());
				re.setPropietarioInmueble(reseEncontradas.get(i)
						.getPropietarioInmueble());
				reservasEncontradas.add(re);
			}

		} catch (Exception e2) {
			FacesUtils.addErrorMessage(e2.getMessage());
		}
	}

	public String action_cargar() {

		Reserva entity = null;
		try {
			String codigoReserva = new String(cmlReserva.getValue().toString());

			entity = BusinessDelegatorView.getReserva(codigoReserva);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (entity == null) {
			txtResCodigo.setDisabled(false);
			cmbTipoZonasComunes.setDisabled(false);
			txtResHoraInicio.setDisabled(false);
			txtResHoraFin.setDisabled(false);
			txtEstCodigo_Estado.setDisabled(true);
			txtEstCodigo_Estado.setDisabled(true);
			txtPriCodigo_PropietarioInmueble.setDisabled(true);
			// txtPriCodigo_PropietarioInmueble.setValue(FacesUtils.getSession().getAttribute("codInmu"));
			txtEstCodigo_Estado.setValue("");
			btnSave.setDisabled(false);
			btnDelete.setDisabled(true);
			btnModify.setDisabled(true);
			btnClear.setDisabled(false);
		} else {
			txtResCodigo.setValue(entity.getResCodigo());
			txtResCodigo.setDisabled(true);
			cmbTipoZonasComunes.setValue(entity.getZonaComun().getZocCodigo());
			cmbTipoZonasComunes.setDisabled(false);
			txtResHoraInicio.setValue(entity.getResHoraInicio());
			txtResHoraInicio.setDisabled(false);
			txtResHoraFin.setValue(entity.getResHoraFin());
			txtResHoraFin.setDisabled(false);
			txtEstCodigo_Estado.setDisabled(true);
			txtPriCodigo_PropietarioInmueble.setValue(entity
					.getPropietarioInmueble().getPriCodigo());

			if (entity.getEstado().getEstCodigo().equals("1")) {
				txtEstCodigo_Estado.setValue("ACTIVA");
			} else {
				txtEstCodigo_Estado.setValue("INACTIVA");
			}

			txtPriCodigo_PropietarioInmueble.setDisabled(true);
			btnSave.setDisabled(true);
			btnDelete.setDisabled(false);
			btnModify.setDisabled(false);
			btnClear.setDisabled(false);
		}
		return "";
	}
		
		
}
